package com.tc.data.spring.util;

import com.tc.data.common.model.AtomModel;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.PathMatcher;

import java.util.HashMap;
import java.util.Map;

public class Utils {

	public static Map<String, String> getDruidDefaulProperties(String driverClassName) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("driverClassName", driverClassName);
		// map.put("initialSize", "0"); //default 0
		// map.put("maxActive", "8"); //default 8
		// map.put("maxIdle", "8"); //已废弃
		// map.put("minIdle", "3"); //default
		// map.put("maxWait", ""); //default
		// map.put("poolPreparedStatements", "false"); //default false
		// map.put("maxOpenPreparedStatements", "-1"); //default -1
		// map.put("validationQuery", "SELECT 1"); //default
		// map.put("testOnBorrow", "true"); //default true
		// map.put("testOnReturn", "false"); //default false
		// map.put("testWhileIdle", "false"); //default false
		// map.put("timeBetweenEvictionRunsMillis", "60000"); //default 60*1000
		// map.put("numTestsPerEvictionRun", ""); //已废弃
		// map.put("minEvictableIdleTimeMillis", "1800000"); //default
		// 30*60*1000
		// map.put("connectionInitSqls", ""); //default
		// map.put("exceptionSorter", ""); //default
		// map.put("filters", ""); //default
		// map.put("proxyFilters", ""); //default
		// map.put("url", ""); //default
		// map.put("username", ""); //default
		// map.put("password", ""); //default
		return map;
	}

	public static Map<String, String> getC3P0DefaulProperties(String driverClassName) {
		Map<String, String> map = new HashMap<String, String>();
		// map.put("acquireIncrement", "3"); //default 3
		// map.put("acquireRetryAttempts", "30"); //default 30
		// map.put("acquireRetryDelay", "1000"); //default 1000
		// map.put("autoCommitOnClose", "false"); //default false
		// map.put("automaticTestTable", ""); //default
		// map.put("breakAfterAcquireFailure", "false"); //default false
		// map.put("checkoutTimeout", "0"); //default 0
		// map.put("connectionCustomizerClassName", ""); //default
		// map.put("connectionTesterClassName", ""); //default
		// com.mchange.v2.c3p0.impl.DefaultConnectionTester
		// map.put("contextClassLoaderSource", "caller"); //default caller
		// map.put("dataSourceName", ""); //default
		// map.put("debugUnreturnedConnectionStackTraces", "false"); //default
		// false
		map.put("driverClass", driverClassName); // default
		// map.put("extensions", ""); //default
		// map.put("factoryClassLocation", ""); //default
		// map.put("forceIgnoreUnresolvedTransactions", "false"); //default
		// false
		// map.put("forceSynchronousCheckins", "false"); //default false
		// map.put("forceUseNamedDriverClass", "false"); //default false
		map.put("idleConnectionTestPeriod", "90"); // default 0
		// map.put("initialPoolSize", "3"); //default 3
		// map.put("jdbcUrl", ""); //default
		// map.put("maxAdministrativeTaskTime", "0"); //default 0
		// map.put("maxConnectionAge", "0"); //default 0
		map.put("maxIdleTime", "1800"); // default 0
		// map.put("maxIdleTimeExcessConnections", "0"); //default 0
		// map.put("maxPoolSize", "10"); //default 15
		// map.put("maxStatements", "0"); //default 0
		// map.put("maxStatementsPerConnection", "0"); //default 0
		// map.put("minPoolSize", "3"); //default 3
		// map.put("numHelperThreads", ""); //default
		// map.put("overrideDefaultUser", ""); //default
		// map.put("overrideDefaultPassword", ""); //default
		// map.put("password", ""); //default
		// map.put("preferredTestQuery", ""); //default
		// map.put("privilegeSpawnedThreads", "false"); //default false
		// map.put("propertyCycle", "0"); //default 0
		// map.put("statementCacheNumDeferredCloseThreads", "0"); //default 0
		// map.put("testConnectionOnCheckin", "false"); //default false
		// map.put("testConnectionOnCheckout", "false"); //default false
		// map.put("unreturnedConnectionTimeout", "0"); //default 0
		// map.put("user", ""); //default
		// map.put("usesTraditionalReflectiveProxies", "false"); //default false
		return map;
	}

	public static Map<String, String> getDBCPDefaulProperties(String driverClassName) {
		Map<String, String> map = new HashMap<String, String>();
		// map.put("username", ""); //default
		// map.put("password", ""); //default
		// map.put("url", ""); //default
		map.put("driverClassName", driverClassName);
		// map.put("connectionProperties", ""); //default
		// map.put("defaultAutoCommit", ""); //default
		// map.put("defaultReadOnly", ""); //default
		// map.put("defaultTransactionIsolation", ""); //default
		// map.put("defaultCatalog", ""); //default
		// map.put("cacheState", ""); //default true
		// map.put("enableAutocommitOnReturn", "true"); //default true
		// map.put("rollbackOnReturn", "true"); //default true
		// map.put("initialSize", "0"); //default 0
		// map.put("maxTotal", "8"); //default 8
		// map.put("maxIdle", "8"); //default 8
		// map.put("minIdle", "3"); //default 0
		// map.put("maxWaitMillis", "-1"); //default -1
		// map.put("validationQuery", "SELECT 1");
		// map.put("validationQueryTimeout", "3000");
		// map.put("testOnCreate", "false"); //default false
		// map.put("testOnBorrow", "true"); //default true
		// map.put("testOnReturn", "false"); //default false
		// map.put("testWhileIdle", "false"); //default false
		// map.put("timeBetweenEvictionRunsMillis", "-1"); //default -1
		// map.put("numTestsPerEvictionRun", "3"); //default 3
		// map.put("minEvictableIdleTimeMillis", "180000"); //default 60*1000*30
		// map.put("softMiniEvictableIdleTimeMillis", "-1"); //default -1
		// map.put("maxConnLifetimeMillis", "-1"); //default -1
		// map.put("connectionInitSqls", "");
		// map.put("lifo", "true"); //default true
		// map.put("poolPreparedStatements", "false"); //default false
		// map.put("maxOpenPreparedStatements", "");
		// map.put("accessToUnderlyingConnectionAllowed", "false"); //default
		// false
		// map.put("removeAbandoned", "false"); //default false
		// map.put("removeAbandonedTimeout", "300"); //default 300
		// map.put("logAbandoned", "false"); //default false
		// map.put("abandonedUsageTracking", "false"); //default false

		return map;
	}
	
	public static Map<String, String> getCaelusDefaulProperties(String driverClassName) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("driverClassName", driverClassName);
		return map;
	}

	public static Map<String, String> getDefaulProperties(String dsType, String dbType) {
		String driverClassName = "com.mysql.jdbc.Driver";
		if (dbType.equalsIgnoreCase("oracle")) {
			driverClassName = "oracle.jdbc.driver.OracleDriver";
		}
		if (dbType.equalsIgnoreCase("h2")) {
			driverClassName = "org.h2.Driver";
		}

		if (dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_DBCP)) {
			return getDBCPDefaulProperties(driverClassName);
		} else if (dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_DRUID)) {
			return getDruidDefaulProperties(driverClassName);
		}else if (dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_CAELUS)) {
			return getCaelusDefaulProperties(driverClassName);
		}

		return getC3P0DefaulProperties(driverClassName);
	}

//	public static Map<String, String> getDbLoginProperties(String logicName, String dbType, String dsType) {
//		String formatStr = "${resource.rdbms.%s.%s.%s}";
//
//		Map<String, String> map = new HashMap<String, String>();
//
//		if (dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_DBCP)) {
//			map.put("url", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "url"));
//			map.put("username", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "username"));
//			map.put("password", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "password"));
//
//			return map;
//		} else if (dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_DRUID)) {
//			map.put("url", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "url"));
//			map.put("username", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "username"));
//			map.put("password", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "password"));
//
//			return map;
//		}
//
//		map.put("jdbcUrl", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "url"));
//		map.put("user", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "username"));
//		map.put("password", String.format(formatStr, dbType.toLowerCase(), logicName.toLowerCase(), "password"));
//
//		return map;
//	}


	public static Map<String, String> getDbLoginPropertiesFromAtom(AtomModel atomModel, String dsType) {
		Map<String, String> map = new HashMap<String, String>();

		if (dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_DBCP)
				|| dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_DRUID)) {
			if (StringUtils.isNotBlank(atomModel.getUrl())) {
				map.put("url", atomModel.getUrl());
			} else {
				map.put("url", "jdbc:mysql://" + atomModel.getHost() + ":" + atomModel.getPort() + "/"
						+ atomModel.getDbName() + "?" + atomModel.getParam());
			}
			map.put("username", atomModel.getUsername());
			map.put("password", atomModel.getPassword());
			return map;
		}

		if (StringUtils.isNotBlank(atomModel.getUrl())) {
			map.put("jdbcUrl", atomModel.getUrl());
		} else {
			map.put("jdbcUrl", "jdbc:mysql://" + atomModel.getHost() + ":" + atomModel.getPort() + "/"
					+ atomModel.getDbName() + "?" + atomModel.getParam());
		}
		map.put(dsType.equalsIgnoreCase(Constants.DATASOURCE_TYPE_CAELUS) ? "username" : "user",
				atomModel.getUsername());
		map.put("password", atomModel.getPassword());
		return map;
	}

	public static boolean isMatch(String patternPath, String requestPath) {
		PathMatcher matcher = new AntPathMatcher();
		return matcher.match(StringUtils.lowerCase(patternPath), StringUtils.lowerCase(requestPath));
	}

}
